# 1 "reloj.c"
# 1 "/home/diego/sodium/kernel//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "reloj.c"

# 1 "../include/usr/reloj.h" 1
# 12 "../include/usr/reloj.h"
void vFnLoopReloj();

void vFnInicializarReloj();
# 3 "reloj.c" 2
# 1 "../include/kernel/puertos.h" 1







# 1 "../include/kernel/definiciones.h" 1
# 14 "../include/kernel/definiciones.h"
# 1 "../include/usr/tipos.h" 1
# 15 "../include/usr/tipos.h"
typedef unsigned int dword;
typedef unsigned short word;
typedef unsigned char byte;

typedef unsigned char u8;
typedef signed char s8;
typedef unsigned short u16;
typedef signed short s16;
typedef unsigned int u32;
typedef signed int s32;


typedef struct _u80 { unsigned int word[20]; } u80;
# 15 "../include/kernel/definiciones.h" 2
# 62 "../include/kernel/definiciones.h"
char stArgAux[128];
# 9 "../include/kernel/puertos.h" 2
# 26 "../include/kernel/puertos.h"
byte inb(word);
# 38 "../include/kernel/puertos.h"
word inw(word);
# 50 "../include/kernel/puertos.h"
void outb(const byte valor, const word puerto);
# 61 "../include/kernel/puertos.h"
void outw(const word valor, const word puerto);
# 4 "reloj.c" 2

# 1 "../include/video.h" 1
# 14 "../include/video.h"
# 1 "../include/kernel/libk/string.h" 1
# 9 "../include/kernel/libk/string.h"
inline unsigned char* ucpFnCopiarMemoria(unsigned char *ucpDestino,
      unsigned char *ucpOrigen,
      unsigned int uiTamanio);
inline unsigned char* ucpFnMemSetCero(unsigned char *ucpDirInicio,
                  unsigned int uiTamanio );

int iFnLongitudCadena (const char *cnstCadena);
int iFnCompararCadenas (const char *, const char *);
int iFnCompararCadenas2 (const char *, const char *);
int iFnCopiaCaracter (char *, const char *);
int iFnCopiaCadena (char *, const char *);

int iFnCopiaEntero (char *, const int);
int iFnCopiaFloat (char *, const float, const int);
int iFnCopiaWord (char *, const word);
int iFnCopiaByte (char *, const byte);
int iFnCopiaHexa (char *, const int);
int iFnCopiaWordHexa (char *, const word);
int iFnCopiaByteHexa (char *, const byte);
void vFnImprimirString (char *, const char *, ...);
int iFnLongitudCadena (const char *);

int iFnCopiaCadena2 (char *, const char *);
char * pstFnConcatenarCadena (char * , char * );
int iFnBuscarEnCadena (char * , char * ,int );
char * pstFnCadenaIzquierda (char * , int );
char * pstFnCadenaDerecha (char * , int );
int iFnEsNumero (char * stCadena);

void vFnStrLwr (char * stCadena);
void vFnStrUpr (char * stCadena);
# 15 "../include/video.h" 2
# 58 "../include/video.h"
typedef char* va_list;
# 100 "../include/video.h"
int iFnImprimirCadenas (int,const char*);




void vFnImprimirEntero (int,const int);




void vFnImprimirFloat (int,const double, const int);




void vFnImprimirHexa (int,const int);




void vFnImprimirWordHexa (int,const word);




void vFnImprimirByteHexa (int,const byte);





void vFnImprimirWin (int,const char*, ... );
void vFnImprimir (const char*, ... );
void vFnImprimirI (const char*, ... );

extern char cFnSysObtenerColor(int);
extern void vFnSysSetearColor(int,char);
extern void vFnSysSetearX(int,int);
extern void vFnSysSetearY(int,int);
extern void vFnClsWin(int);





void vFnImprimirContextSwitch(int color,int pid, char* nombre, int indiceGDT);
void vFnImprimirPrompt();
void vFnImprimirOk(int linea);
void vFnImprimirNOk(int linea);

void vFnImprimirVentana (int hVentana, const char *cnstCadena, ...);






int bTerminalActiva;

void vFnCambiarTerminal(void);
void vFnLog (const char *cnstCadena, ...);

void vFnLogScrollArriba();
void vFnLogScrollAbajo();

void vFnLogScrollMaximo();
void vFnLogScrollMinimo();
void vFnLogBorrar();
# 6 "reloj.c" 2
# 1 "../include/kernel/tiempo.h" 1
# 53 "../include/kernel/tiempo.h"
typedef unsigned long int time_t;
typedef unsigned long int clock_t;





typedef struct{

        clock_t tms_utime;


        clock_t tms_stime;


        clock_t tms_cutime;


        clock_t tms_cstime;
} tms;





typedef struct{

        int tz_minuteswest;


        int tz_dsttime;
} timezone;





typedef struct{

        unsigned long int tv_sec;


        unsigned long int tv_usec;
} timeval;





typedef struct{

        timeval it_interval;


        timeval it_value;
} itimerval;





typedef struct{

        int modes;


 long offset;


 long freq;


 long maxerror;


 long esterror;


 int status;


 long constant;


 long precision;


 long tolerance;


 timeval time;


 long tick;
} timex;





typedef struct{

        long int tv_sec;


        long int tv_nsec;
} timespec;
# 7 "reloj.c" 2
extern unsigned long int ulTiempo;
extern int iRelojEstado;
# 19 "reloj.c"
static unsigned
stauFnLeerCmos (unsigned uRegistro, char cCaracter)
{
  unsigned uDigitoAlto, uDigitoBajo;

  outb (uRegistro, 0x70);
  uDigitoAlto = uDigitoBajo = inb (0x71);
  if (!cCaracter)
    return uDigitoBajo;

  uDigitoAlto >>= 4;
  uDigitoAlto &= 0x0F;
  uDigitoBajo &= 0x0F;
  return 10 * uDigitoAlto + uDigitoBajo;
}
# 44 "reloj.c"
long lFnContarSegundos(int fecha[6])
{
 int anioInicio = 2000;
 int secuenciaAnioBisiesto[13] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
 int secuenciaAnioNoBisiesto[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};


 long segundosAcumulados = fecha[5] + fecha[4] * 60 + fecha[3] * 3600;


   segundosAcumulados += (fecha[2] - 1) * 86400;


 if ((fecha[1] % 4) == 0)
 {
      segundosAcumulados += secuenciaAnioBisiesto[fecha[1]] * 86400;
 }
 else
 {
      segundosAcumulados += secuenciaAnioNoBisiesto[fecha[1]] * 86400;
 }


   for(; fecha[0] > anioInicio; anioInicio++)
 {
  if ((anioInicio % 4) == 0)
   segundosAcumulados += 366 * 86400;
  else
   segundosAcumulados += 365 * 86400;
 }

   return segundosAcumulados;
}
# 85 "reloj.c"
void
vFnInicializarReloj(){
  unsigned uMes, uDia, uHora, uMinuto, uSegundo;
  int iAnio;
  int piFecha[6];

  int iCaracter;
  iCaracter = -1;
  if (iCaracter == -1)
  {
    outb (0x0B, 0x70);
    if (inb (0x71) & 0x04)
      iCaracter = 0;
    else
      iCaracter = 1;
  }


  iAnio = stauFnLeerCmos (9, iCaracter);
  uMes = stauFnLeerCmos (8, iCaracter);
  uDia = stauFnLeerCmos (7, iCaracter);


  uHora = stauFnLeerCmos (4, iCaracter);
  uMinuto = stauFnLeerCmos (2, iCaracter);
  uSegundo = stauFnLeerCmos (0, iCaracter);

  piFecha[0] = iAnio;
  piFecha[1] = uMes;
  piFecha[2] = uDia;
  piFecha[3] = uHora;
  piFecha[4] = uMinuto;
  piFecha[5] = uSegundo;

   ulTiempo = lFnContarSegundos(piFecha);



  ulTiempo*= 1000;

  iRelojEstado = 0;
}







void
vFnLoopReloj()
{

  static int staiCaracter;
  unsigned int uAnio, uMes, uDia, uHora, uMinuto, uSegundo;

  int iAnioAnterior, iMesAnterior, iDiaAnterior, iHoraAnterior, iMinutoAnterior, iSegundoAnterior;
      iAnioAnterior= iMesAnterior= iDiaAnterior= iHoraAnterior= iMinutoAnterior= iSegundoAnterior= -1;

  while (1)
    {
      staiCaracter = -1;
      if (staiCaracter == -1)
 {
   outb (0x0B, 0x70);
   if (inb (0x71) & 0x04)
     staiCaracter = 0;
   else
     staiCaracter = 1;
 }

      uAnio = stauFnLeerCmos (9, staiCaracter);
      uMes = stauFnLeerCmos (8, staiCaracter);
      uDia = stauFnLeerCmos (7, staiCaracter);

      vFnSysSetearX (7, 0);
      if (uDia != iDiaAnterior)
 {
   iDiaAnterior = uDia;
   vFnSysSetearX (7, 0);
   if (uDia < 10)
     vFnImprimirVentana (7, "0%d/", uDia);
   else
     vFnImprimirVentana (7, "%d/", uDia);
 }

      vFnSysSetearX (7, 3);
      if (uMes != iMesAnterior)
 {
   iMesAnterior = uMes;
   if (uMes < 10)
     vFnImprimirVentana (7, "0%d/", uMes);
   else
     vFnImprimirVentana (7, "%d/", uMes);
 }

      vFnSysSetearX (7, 6);
      if (uAnio != iAnioAnterior)
 {
   iAnioAnterior = uAnio;
   if (uAnio < 10)
     vFnImprimirVentana (7, "0%d ", uAnio);
   else
     vFnImprimirVentana (7, "%d ", uAnio);
 }



      uHora = stauFnLeerCmos (4, staiCaracter);
      uMinuto = stauFnLeerCmos (2, staiCaracter);
      uSegundo = stauFnLeerCmos (0, staiCaracter);


      vFnSysSetearX (7, 9);
      if (uHora != iHoraAnterior)
 {
   iHoraAnterior = uHora;
   if (uHora < 10)
     vFnImprimirVentana (7, "0%d:", uHora);
   else
     vFnImprimirVentana (7, "%d:", uHora);
 }
      vFnSysSetearX (7, 12);
      if (uMinuto != iMinutoAnterior)
 {



   iMinutoAnterior = uMinuto;
   if (uMinuto < 10)
     vFnImprimirVentana (7, "0%d:", uMinuto);
   else
     vFnImprimirVentana (7, "%d:", uMinuto);
 }
      vFnSysSetearX (7, 15);
      if (uSegundo < 10)
 vFnImprimirVentana (7, "0%d", uSegundo);
      else
 vFnImprimirVentana (7, "%d", uSegundo);


    }
}
